<?php
	require_once("model/BasePdo.php");
	
	# Le 'Data Access Object' d'un ensemble images
	class ImageDAO {
		
		# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		# A MODIFIER EN FONCTION DE VOTRE INSTALLATION
		# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		# Chemin LOCAL où se trouvent les images
		static private $path="/var/www/sites/data/IMG";
		# Chemin URL où se trouvent les images
		static private $urlPath="http://localhost/sites/data/IMG";
		
		private $db;
		
		# Tableau pour stocker tous les chemins des images
		private $imgEntry;
		
		function __construct() {
			$this->db = new BasePdo();
		}
		
		/**
		 * Retourne le chemin d'accès aux images
		 */
		static function getUrlPath(){
			return self::$urlPath;
		}
		
		/**
		 * Retourne le chemin d'accès aux images
		 */
		static function getPath(){
			return self::$path;
		}
		
		/**
		 * Retourne le nombre d'images référencées dans le DAO
		 */
		function count() {
			return $this->db->doCount("image");
		}
		
		/////////////////////////////////////////////////IMAGE////////////////////////////////////////////
		
		/**
		 * Retourne un objet image correspondant à l'identifiant()
		 */
		
		function getImage($id){
			return $this->db->findById("image",$id);
		}
		
		/**
		 * Retourne une image au hasard
		 */
		function getRandomImage() {
		      $id=rand(1,$this->count()-1);
		      return $this->getImage($id);
		}
		
		/**
		 * Retourne l'objet de la premiere image
		 */
		function getFirstImage() {
			return $this->getImage(1);
		}
		
		/**
		 * Retourne l'image suivante d'une image
		 */
		function getNextImage(image $img) {
			$id = $img->getId();
			if ($id < $this->count()) {
				$img = $this->getImage($id+1);
			}else{
				$img = $this->getImage(1);

			}
			return $img;
		}
		
		/**
		 * Retourne l'image précédente d'une image
		 */
		function getPrevImage(image $img) {
			$id = $img->getId();
			if ($id > 1) {				
				$img = $this->getImage($id-1);
			}else{
				$img = $this->getImage($this->count());

			}
			return $img;
		}
		
		/**
		 * saute en avant ou en arrière de $nb images
		 * Retourne la nouvelle image
		 */
		function jumpToImage(image $img,$nb) {
			    $id = $img->getId() + $nb;
			    if($id<=0){
			    }else if($id>=$this->count()){
			    }else{
			      $img = $this->getImage($id);
			    }
			    return $img;
			  }
		
		/**
		 * Retourne la liste des images consécutives à partir d'une image
		 */
		function getImageList(image $img,$nb) {
			# Verifie que le nombre d'image est non nul
			if (!$nb > 0) {
				debug_print_backtrace();
				trigger_error("Erreur dans ImageDAO.getImageList: nombre d'images nul");
			}
			$id = $img->getId();
			$max = $id+$nb;
			$res = array();
			while ($id < $this->count() && $id < $max) {
				$res[] = $this->getImage($id);
				$id++;
			}
			return $res;
		}

		
		
		/**
		 * Ajouter une nouvelle image
		 */
		function createImg($img) {
			return $this->db->insertImg($img);
		}
		
		/**
		 * Met à jour une image
		 */
		function updateImg($img) {
			return $this->db->updateImg("image", $img);
		}
		
		/**
		 * Recupere toutes les categories d'image en base
		 */
		function getCategories() {
			$categories = array();
			$tab = $this->db->getCategories("image");
			foreach($tab as $cat=>$val){
				$categories[] = $val->getCategory();
			}
			return $categories;
		}
		
		/**
		 * Recupere le nombre d'image pour une categorie donné
		 */
		function getNbImageCategory($category) {
			return $this->db->doCount("image","WHERE category = '$category'");
		}
		function getLastImage() {
		return requeteRechercheSimple("SELECT id FROM image ORDER BY id DESC LIMIT 1","Image");
		}
		/**
		 * Supprime une image
		 */
		function removeImage($id_image){
			 $this->db->requeteSimple("DELETE FROM image WHERE id = $id_image");
		}
		///////////////////////////////////////////////////NOTE/////////////////////////////////////////////////////////
		
		/**
		 * Retourne les notes pour un idImg doné
		 * @param int $idImg
		 */
		function getNote($idImg){
			return $this->db->getNoteByIdImg("note",$idImg);
		}
		
		
		/**
		 * Met a jour la note d'une image
		 * @param String $val indique la note(Pos/Neg) a modifier
		 * @param int $idImg id de l'image
		 */
		function updateNote($val, $idImg){
			$note = $this->getNote($idImg);
			$this->db->updateNote("note",$val, $note);
		}
	
	///////////////////////////////////////////////////ALBUM/////////////////////////////////////////////////////////
		/**
		 * Retourne toutes les albums
		 */
		function getAlbums(){			
			return $this->db->requeteRechercheAvancee("SELECT * FROM album","Album");
		}
		/**
		 * Retourne un album grace à son id
		 * @param $id Entier identfiant de l'album'
		 */		function getAlbum($id){			
			return $this->db->findById("album",$id);
		}
		/**
		 * Retourne un album La premiere image d'un Album
		 * @param $Albumid Entier identfiant de l'album'
		 */
		function getFirstImgTrie($album_id){
			return $this->db->requeteRechercheSimple("SELECT * FROM image WHERE id IN (SELECT image_id FROM appartient_album WHERE album_id=$album_id ) ORDER BY id  LIMIT 1 ","Image");
		}
		function getNextImgTrie($album_id,$img_id){
			return $this->db->requeteRechercheSimple("SELECT * FROM image WHERE id IN (SELECT image_id FROM appartient_album WHERE album_id=$album_id AND image_id>$img_id ) ORDER BY id  LIMIT 1 ","Image");
		}
		function getPrevImgTrie($album_id,$img_id){
			return $this->db->requeteRechercheSimple("SELECT * FROM image WHERE id IN (SELECT image_id FROM appartient_album WHERE album_id=$album_id AND image_id<$img_id ) ORDER BY id  LIMIT 1 ","Image");
		}
		function getLastAlbum() {
		return  $this->db->requeteRechercheSimple("SELECT * FROM album ORDER BY id DESC LIMIT 1","Album");
		}
		/**
		 * Supprime un album
		 */
		function removeAlbum($id_album){
			 $this->db->requeteSimple("DELETE FROM appartient_album WHERE album_id = $id_album");
			 $this->db->requeteSimple("DELETE FROM album WHERE id = $id_album");
		}
		/**
		 * Vide un album
		 */
		function emptyAlbum($id_album){
			$this->db->requeteSimple("UPDATE album set img_enavant_id=NULL WHERE id='$id_album'");
			$this->db->requeteSimple("DELETE FROM appartient_album WHERE album_id = $id_album");
		}
		function addAlbum($imgEnavant,$name,$description){
						 if ($imgEnavant==""){
						 	$imgEnavant="NULL";
						 }
			 $this->db->requeteSimple("INSERT into album (id,name,description,img_enavant_id) VALUES(NULL,'".$name."','".$description."',$imgEnavant)");
			 if ($imgEnavant!="NULL"){
			 	$this->addImageAlbum($imgEnavant, $this->getLastAlbum()->getId());
			 }
		}
		function addImageAlbum($id_image,$id_album){
			 $this->db->requeteSimple("INSERT into appartient_album (album_id,image_id) VALUES ('".$id_album."','".$id_image."')");
		}
		function removeImageAlbum($id_image,$id_album){
			 $this->db->requeteSimple("DELETE FROM appartient_album WHERE album_id = $id_album AND image_id =$id_image");
		}
		function getImages(){
			return $this->db->requeteRechercheAvancee("SELECT * FROM image","Image");
		}
		/**
		 * Retourne toutes les images d'un album'
		 */
		function getImageByAlbum($album){
			return $this->db->requeteRechercheAvancee("SELECT * FROM image  where id in (select image_id from appartient_album where album_id=".$album->id.")","Image");
		}
		function getOtherAlbumImg($albumId){
			return $this->db->requeteRechercheAvancee("SELECT * FROM image  WHERE id NOT IN (select image_id from appartient_album where album_id=".$albumId.")","Image");
		}		
		/**
		 * Retourne toutes les id des images d'un album
		 */
		function getIdsImgAlbum($idAlbum){
			return $this->db->getIdImgAlbum("note",$idAlbum);
		}
				
		/**
		 * Retourne toutes les id des albums dont fait partie une image
		 */
		function getIdsAlbumImg($idImg){
			return $this->db->getIdAlbumImg("note",$idImg);
		}
	}
	
	/** 
	 * Test unitaire
	 * Appeler le code PHP depuis le navigateur avec la variable test
	 * Exemple : http://localhost/LP3/model/image.php?test
	 */
	if (isset($_GET["test"])) {
		echo "<H1>Test de la classe ImageDAO</H1>";
		$imgDAO = new ImageDAO();
		echo "<p>Creation de l'objet ImageDAO.</p>\n";
		echo "<p>La base contient ".$imgDAO->count()." images.</p>\n";
		$img = $imgDAO->getFirstImage("");
		echo "La premiere image est : ".$img->getURL()."</p>\n";
		# Affiche l'image
		echo "<img src=\"".$img->getURL()."\"/>\n";
	}
	
	?>